﻿/*! DataTables jQuery UI integration
 * ©2011-2014 SpryMedia Ltd - datatables.net/license
 */

/**
 * DataTables integration for jQuery UI. This requires jQuery UI and
 * DataTables 1.10 or newer.
 *
 * This file sets the defaults and adds options to DataTables to style its
 * controls using Bootstrap. See http://datatables.net/manual/styling/jqueryui
 * for further information.
 */
(function (window, document, undefined) {

    var factory = function ($, DataTable) {
        "use strict";


        var sort_prefix = 'css_right ui-icon ui-icon-';
        var toolbar_prefix = 'fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix ui-corner-';

        /* Set the defaults for DataTables initialisation */
        $.extend(true, DataTable.defaults, {
            dom:
                '<"' + toolbar_prefix + 'tl ui-corner-tr"lfr>' +
                't' +
                '<"' + toolbar_prefix + 'bl ui-corner-br"ip>',
            renderer: 'jqueryui'
        });


        $.extend(DataTable.ext.classes, {
            "sWrapper": "dataTables_wrapper dt-jqueryui",

            /* Full numbers paging buttons */
            "sPageButton": "fg-button ui-button ui-state-default",
            "sPageButtonActive": "ui-state-disabled",
            "sPageButtonDisabled": "ui-state-disabled",

            /* Features */
            "sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi " +
                "ui-buttonset-multi paging_", /* Note that the type is postfixed */

            /* Sorting */
            "sSortAsc": "ui-state-default sorting_asc",
            "sSortDesc": "ui-state-default sorting_desc",
            "sSortable": "ui-state-default sorting",
            "sSortableAsc": "ui-state-default sorting_asc_disabled",
            "sSortableDesc": "ui-state-default sorting_desc_disabled",
            "sSortableNone": "ui-state-default sorting_disabled",
            "sSortIcon": "DataTables_sort_icon",

            /* Scrolling */
            "sScrollHead": "dataTables_scrollHead " + "ui-state-default",
            "sScrollFoot": "dataTables_scrollFoot " + "ui-state-default",

            /* Misc */
            "sHeaderTH": "ui-state-default",
            "sFooterTH": "ui-state-default"
        });


        DataTable.ext.renderer.header.jqueryui = function (settings, cell, column, classes) {
            // Calculate what the unsorted class should be
            var noSortAppliedClass = sort_prefix + 'carat-2-n-s';
            var asc = $.inArray('asc', column.asSorting) !== -1;
            var desc = $.inArray('desc', column.asSorting) !== -1;

            if (!column.bSortable || (!asc && !desc)) {
                noSortAppliedClass = '';
            }
            else if (asc && !desc) {
                noSortAppliedClass = sort_prefix + 'carat-1-n';
            }
            else if (!asc && desc) {
                noSortAppliedClass = sort_prefix + 'carat-1-s';
            }

            // Setup the DOM structure
            $('<div/>')
                .addClass('DataTables_sort_wrapper')
                .append(cell.contents())
                .append($('<span/>')
                    .addClass(classes.sSortIcon + ' ' + noSortAppliedClass)
                )
                .appendTo(cell);

            // Attach a sort listener to update on sort
            $(settings.nTable).on('order.dt', function (e, settings, sorting, columns) {
                var colIdx = column.idx;

                cell
                    .removeClass(classes.sSortAsc + " " + classes.sSortDesc)
                    .addClass(columns[colIdx] == 'asc' ?
                        classes.sSortAsc : columns[colIdx] == 'desc' ?
                            classes.sSortDesc :
                            column.sSortingClass
                    );

                cell
                    .find('span.' + classes.sSortIcon)
                    .removeClass(
                        sort_prefix + 'triangle-1-n' + " " +
                        sort_prefix + 'triangle-1-s' + " " +
                        sort_prefix + 'carat-2-n-s' + " " +
                        sort_prefix + 'carat-1-n' + " " +
                        sort_prefix + 'carat-1-s'
                    )
                    .addClass(columns[colIdx] == 'asc' ?
                        sort_prefix + 'triangle-1-n' : columns[colIdx] == 'desc' ?
                            sort_prefix + 'triangle-1-s' :
                            noSortAppliedClass
                    );
            });
        };


        /*
         * TableTools jQuery UI compatibility
         * Required TableTools 2.1+
         */
        if (DataTable.TableTools) {
            $.extend(true, DataTable.TableTools.classes, {
                "container": "DTTT_container ui-buttonset ui-buttonset-multi",
                "buttons": {
                    "normal": "DTTT_button ui-button ui-state-default"
                },
                "collection": {
                    "container": "DTTT_collection ui-buttonset ui-buttonset-multi"
                }
            });
        }

    }; // /factory


    // Define as an AMD module if possible
    if (typeof define === 'function' && define.amd) {
        define(['jquery', 'datatables'], factory);
    }
    else if (typeof exports === 'object') {
        // Node/CommonJS
        factory(require('jquery'), require('datatables'));
    }
    else if (jQuery) {
        // Otherwise simply initialise as normal, stopping multiple evaluation
        factory(jQuery, jQuery.fn.dataTable);
    }


})(window, document);
